package br.com.tcc.gp.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.tcc.gp.modelo.Advogado;
import br.com.tcc.gp.modelo.Cela;
import br.com.tcc.gp.modelo.Detento;
import br.com.tcc.gp.modelo.Endereco;
import br.com.tcc.gp.modelo.Processo;
import br.com.tcc.gp.util.DBConnector;


public class DetentoDAO extends PessoaDAO{
	
	Detento detento;
	private Connection conexao;
	ResultSet resultado;
	private List<Detento> listaDetento;
	private PreparedStatement preparedStatement;
	private int linhas;
	
	
	public static final String NIVELSEGURANCA = "nivel_seguranca";
	public static final String HISTORICO = "historico";
	public static final String DATA_SAIDA = "data_saida";
	public static final String DATA_ENTRADA = "data_entrada";
	public static final String SEQUENCIA = "seq_detento";
	
	public static final String PROCESSO = "processo";
	public static final String ID_PROCESSO = "id_processo";
	public static final String CODIGOPROCESSO = "codigo";
	public static final String CRIME = "crime";
	public static final String TEMPO_RECLUSAO = "tempo_reclusao";
	
	public static final String CODENDERECO = "codigo";
	public static final String ENDERECO= "endereco";
	public static final String CIDADE = "cidade";
	public static final String CEP = "cep";
	public static final String EMAIL = "email";
	public static final String FONE1 = "fone1";
	public static final String FONE2 = "fone2";
	
	public static final String ID_CELA = "id_cela";
	public static final String CODIGOCELA = "codigo";
	
	public static final String ADVOGADO = "advogado";
	public static final String ID_ADVOGADO = "id_advogado";
	public static final String CODIGOADVOGADO = "codigo";

	
	public DetentoDAO(){		
		try {
			listaDetento = new ArrayList<Detento>();
			conexao = DBConnector.getConnection();
			listaDetento = new ArrayList<Detento>();
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("Conexao Falhou");
		}
		
	}
	
	public int salvar(Detento det, int codigoPessoa){
		
		try {							 		
			String sql = "INSERT INTO DETENTO (CODIGO, NIVEL_SEGURANCA, HISTORICO, DATA_ENTRADA, DATA_SAIDA,"
					+ " ID_PESSOA, ID_CELA, ID_ADVOGADO, ID_PROCESSO)"
					+ " VALUES (" + SEQUENCIA + ".nextval, ? , ?, ?, ?, ?, ?, ?, ?)";
			preparedStatement = conexao.prepareStatement(sql);
			preparedStatement.setInt(1, det.getNivelSeguranca());
			preparedStatement.setString(2, det.getHistorico());			
			preparedStatement.setDate(3, new java.sql.Date(det.getDataEntrada().getTime()));  
			preparedStatement.setDate(4, new java.sql.Date(det.getDatasaida().getTime()));  
			preparedStatement.setInt(5, codigoPessoa);
			preparedStatement.setInt(6, det.getCela().getCodigo());			
			preparedStatement.setInt(7, det.getAdvogado().getCodigo());
			preparedStatement.setInt(8, det.getProcesso().getCodigo());
			linhas = preparedStatement.executeUpdate();
			conexao.commit();
			return linhas;
	} catch (SQLException sqlException) {
		sqlException.printStackTrace();
	}
	return 0;
	}
	
	public int alterar(Detento det) {
		try {							 		
			String sql = "UPDATE detento SET nivel_seguranca = ?, historico = ?, data_entrada = ?, "
					+ "data_saida = ?, id_cela = ?, id_advogado = ?, id_processo = ? WHERE CODIGO = ?";
			preparedStatement = conexao.prepareStatement(sql);
			preparedStatement.setInt(1, det.getNivelSeguranca());
			preparedStatement.setString(2,det.getHistorico());
			preparedStatement.setDate(3, new java.sql.Date(det.getDataEntrada().getTime()));
			preparedStatement.setDate(4, new java.sql.Date(det.getDatasaida().getTime()));
			preparedStatement.setInt(5, det.getCela().getCodigo());
			preparedStatement.setInt(6, det.getAdvogado().getCodigo());
			preparedStatement.setInt(7, det.getProcesso().getCodigo());
			preparedStatement.setInt(8, det.getCodigo());
			linhas = preparedStatement.executeUpdate();
			conexao.commit();
			return linhas;
	} catch (SQLException sqlException) {
		sqlException.printStackTrace();
	}
	return 0;
	}
	
	public Detento pesquisar(String  rgOuCpfouNome){		
		try {
			String sql = "SELECT p." +CPF+ ", p." + NOME + ", p." + RG + ", p." + SEXO +
						", d."+ID+"\"ID\", d."+NIVELSEGURANCA+", d."+HISTORICO+", d."+DATA_ENTRADA+", d."+DATA_SAIDA+
						", e."+CODENDERECO+"\"CODIGOENDERECO\", e."+CIDADE+", e."+CEP+", e."+ENDERECO+
						", e."+FONE1+", e."+FONE2+", e."+EMAIL+
						", pr."+CODIGOPROCESSO+"\"CODIGOPROCESSO\", pr."+CRIME+", pr."+TEMPO_RECLUSAO+
						", adv."+CODIGOADVOGADO+"\"CODIGOADVOGADO\", c."+CODIGOCELA+"\"CODIGOCELA\""+
						" FROM detento d"+
							" join pessoa p on d.id_pessoa = p.codigo"+
							" join cela c on d.id_cela = c.codigo"+
							" join endereco e on p.id_endereco = e.codigo"+
							" join processo pr on d.id_processo = pr.codigo"+ 
							" join advogado adv on d.id_advogado = adv.codigo"+ 
							" WHERE p.rg = ? or p.cpf = ? or p.nome = ?";

			preparedStatement = conexao.prepareStatement(sql);
			preparedStatement.setString(1, rgOuCpfouNome);
			preparedStatement.setString(2, rgOuCpfouNome);
			preparedStatement.setString(3, rgOuCpfouNome);
			resultado = preparedStatement.executeQuery();
			
			
			while (resultado.next()) {	
				detento = new Detento();
				detento.setCodigo(resultado.getInt(ID));
				detento.setNome(resultado.getString(NOME));
				detento.setCpf(resultado.getString(CPF));
				detento.setRg(resultado.getString(RG));
				detento.setSexo(resultado.getString(SEXO));
				detento.setDataEntrada(resultado.getDate(DATA_ENTRADA));
				detento.setDatasaida(resultado.getDate(DATA_SAIDA));
				detento.setHistorico(resultado.getString(HISTORICO));
				detento.setNivelSeguranca(resultado.getInt(NIVELSEGURANCA));
				 
				Endereco endereco = new Endereco();
    			endereco.setCodigo(resultado.getInt(CODENDERECO));
    			endereco.setEndereco(resultado.getString(ENDERECO));
    			endereco.setCep(resultado.getString(CEP));
    			endereco.setCidade(resultado.getString(CIDADE));
    			endereco.setEmail(resultado.getString(EMAIL));
    			endereco.setFone1(resultado.getString(FONE1));
    			endereco.setFone2(resultado.getString(FONE2));    			
    			detento.setEndereco(endereco);
    			
    			Processo processo =  new Processo();
    			processo.setCodigo(resultado.getInt(CODIGOPROCESSO));
    			processo.setCrime(resultado.getString(CRIME));
    			processo.setTempoReclusao(resultado.getString(TEMPO_RECLUSAO));    			
    			detento.setProcesso(processo);
    			
    			Advogado adv = new Advogado();
    			adv.setCodigo(resultado.getInt(CODIGOADVOGADO));
    			detento.setAdvogado(adv);
    			
    			Cela cela = new Cela();
    			cela.setCodigo(resultado.getInt(CODIGOCELA));
    			detento.setCela(cela);    			
			}			
			return detento;
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
	return null;
	}
	
	public int deletar(Detento det) {
		try {
			System.out.println("Deltado detento, codigo: "+det.getCodigo() +
					" Nome:"+ det.getNome()+
					" codigo endereco:"+det.getEndereco().getCodigo());
			
			String sql = "DELETE FROM detento WHERE codigo = ?";
			preparedStatement = conexao.prepareStatement(sql);
			preparedStatement.setInt(1, det.getCodigo());
			linhas = preparedStatement.executeUpdate();
			conexao.commit();			
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
		return linhas;
	}
	
	public List<Detento> listar(){
		try {
			String sql = "SELECT p." +CPF+ ", p." + NOME + ", p." + RG + ", p." + SEXO +
					", d."+ID+", d."+NIVELSEGURANCA+", d."+HISTORICO+", d."+DATA_ENTRADA+", d."+DATA_SAIDA+
					", e."+CODENDERECO+", e."+CIDADE+", e."+CEP+", e."+ENDERECO+
					", e."+FONE1+", e."+FONE2+", e."+EMAIL+
					", pr."+CODIGOPROCESSO+", pr."+CRIME+", pr."+TEMPO_RECLUSAO+
					", adv."+CODIGOADVOGADO+
					", c."+CODIGOCELA+
					" FROM detento d"+
						" join pessoa p on d.id_pessoa = p.codigo"+
						" join cela c on d.id_cela = c.codigo"+
						" join endereco e on p.id_endereco = e.codigo"+
						" join processo pr on d.id_processo = pr.codigo"+ 
						" join advogado adv on d.id_advogado = adv.codigo";
		

			preparedStatement = conexao.prepareStatement(sql);
			resultado = preparedStatement.executeQuery();
			
			while (resultado.next()) {		
				detento = new Detento();
				detento.setCodigo(resultado.getInt(ID));
				detento.setNome(resultado.getString(NOME));
				detento.setCpf(resultado.getString(CPF));
				detento.setRg(resultado.getString(RG));
				detento.setSexo(resultado.getString(SEXO));
				detento.setDataEntrada(resultado.getDate(DATA_ENTRADA));
				detento.setDatasaida(resultado.getDate(DATA_SAIDA));
				detento.setHistorico(resultado.getString(HISTORICO));
				detento.setNivelSeguranca(resultado.getInt(NIVELSEGURANCA));
				 
				Endereco endereco = new Endereco();
    			endereco.setCodigo(resultado.getInt(CODENDERECO));
    			endereco.setEndereco(resultado.getString(ENDERECO));
    			endereco.setCep(resultado.getString(CEP));
    			endereco.setCidade(resultado.getString(CIDADE));
    			endereco.setEmail(resultado.getString(EMAIL));
    			endereco.setFone1(resultado.getString(FONE1));
    			endereco.setFone2(resultado.getString(FONE2));    			
    			detento.setEndereco(endereco);
    			
    			Processo processo =  new Processo();
    			processo.setCodigo(resultado.getInt(CODIGOPROCESSO));
    			processo.setCrime(resultado.getString(CRIME));
    			processo.setTempoReclusao(resultado.getString(TEMPO_RECLUSAO));    			
    			detento.setProcesso(processo);
    			
    			Advogado adv = new Advogado();
    			adv.setCodigo(resultado.getInt(CODIGOADVOGADO));
    			detento.setAdvogado(adv);
    			
    			Cela cela = new Cela();
    			cela.setCodigo(resultado.getInt(CODIGOCELA));
    			detento.setCela(cela);  
    			
    			listaDetento.add(detento);
			}			
			return listaDetento;
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
	return null;
	}
}